/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bombercloud.client;

import bombercloud.commons.Boneco;
import bombercloud.commons.Mapa;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import bombercloud.commons.Request;
import bombercloud.commons.Response;
import java.awt.Color;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author Delano
 */
public class Bomber extends JFrame {

    JPanel mainPanel;
    JButton botaoIniciar, botaoBonecoBranco, botaoBonecoPreto, botaoBonecoAzul, botaoBonecoVermelho, botaoBonecoVerde;
    JLabel labelIniciar;
    Boneco boneco = new Boneco();
    private ArrayList<Boneco> listBonecos = new ArrayList<Boneco>();
    private Socket socket;
    private ObjectInputStream inputStream;
    private ObjectOutputStream outputStream;
    String usuarioPC = null;

    public Bomber() throws HeadlessException {
        usuarioPC = System.getProperty("user.name");
        setSize(410, 315);
        setLocationRelativeTo(null);
        setLayout(null);
        setResizable(false);
        this.setTitle("Bomber Cloud");

        mainPanel = (JPanel) this.getContentPane();
        criacaoDaTela(mainPanel);
        

        //C:\Users\ \Documents\NetBeansProjects\bombercloud-client
        
        try {
            socket = new Socket("localhost", 6666);
            outputStream = new ObjectOutputStream((socket.getOutputStream()));
            inputStream = new ObjectInputStream((socket.getInputStream()));
        } catch (UnknownHostException ex) {
            System.out.println(ex.getMessage());

        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }

        //pega a lista dos bonecos já criados para remover os botões já escoolhidos.
        Request request = new Request();
        request.setType(Request.REQUEST_TYPE_PLAYERS);
        executeRequest(request);
        declaraEventos(this);
    }

    private void criacaoDaTela(JPanel mainPanel) {

        Font fonte = new Font("Tahoma", Font.BOLD, 24);
        Font fonte2 = new Font("Tahoma", Font.BOLD, 12);

        labelIniciar = new JLabel("Bomber Cloud");
        labelIniciar.setSize(168, 29);
        labelIniciar.setLocation(120, 20);
        labelIniciar.setFont(fonte);
        mainPanel.add(labelIniciar);

        botaoIniciar = new JButton("Iniciar Partida");
        botaoIniciar.setFont(fonte2);
        botaoIniciar.setSize(130, 30);
        botaoIniciar.setLocation(140, 100);
        botaoIniciar.setEnabled(false);
        mainPanel.add(botaoIniciar);

        botaoBonecoBranco = new JButton(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "BRANCO_FOTO.png"));
        botaoBonecoBranco.setSize(48, 40);
        botaoBonecoBranco.setLocation(30, 200);
//        botaoBonecoBranco.setBackground(Color.decode("#0066FF"));
        mainPanel.add(botaoBonecoBranco);

        botaoBonecoPreto = new JButton(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "PRETO_FOTO.png"));
        botaoBonecoPreto.setSize(48, 40);
        botaoBonecoPreto.setLocation(100, 200);
        mainPanel.add(botaoBonecoPreto);

        botaoBonecoAzul = new JButton(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "AZUL_FOTO.png"));
        botaoBonecoAzul.setSize(48, 40);
        botaoBonecoAzul.setLocation(170, 200);
        mainPanel.add(botaoBonecoAzul);

        botaoBonecoVermelho = new JButton(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "VERMELHO_FOTO.png"));
        botaoBonecoVermelho.setSize(48, 40);
        botaoBonecoVermelho.setLocation(240, 200);
        mainPanel.add(botaoBonecoVermelho);

        botaoBonecoVerde = new JButton(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "VERDE_FOTO.png"));
        botaoBonecoVerde.setSize(48, 40);
        botaoBonecoVerde.setLocation(310, 200);
        mainPanel.add(botaoBonecoVerde);


    }

    private void declaraEventos(final JFrame b) {
        // Eventos de Janela JFrame

        this.addWindowListener(
                new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });

        //ao clicar nesse botao, pega o socket, o output e o input criado, assim como o número do boneco escolhido
        //e passa como parametro para a a UI que criará o tabuleiro com a informação de qual boneco foi escolhido.
        botaoIniciar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Request request = new Request();
                request.setType(Request.REQUEST_TYPE_START);
                executeRequest(request);
            }
        });

        //ao clicar nesse botao pega a posição da imagem dele, remove o botao e coloca uma imagem de selecionado
        //no mesmo lugar que tinha o botão, o método atualizaBotao muda as outras imagens para não serem mais clicaveis
        botaoBonecoBranco.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //requisita a criação do boneco setando o parametro1 = 1, para o servidor criar o boneco na primeira posição
                //e com a roupa branca.
                Request request = new Request();
                request.setType(Request.REQUEST_TYPE_CREATE_PLAYER);
                request.setParam1(1);
                executeRequest(request);
                botaoBonecoBranco.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "BRANCO_FOTO.png"));
                botaoBonecoBranco.setBackground(Color.decode("#004000"));
                atualizaBotoes(1);
            }
        });

        botaoBonecoPreto.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Request request = new Request();
                request.setType(Request.REQUEST_TYPE_CREATE_PLAYER);
                request.setParam1(2);
                executeRequest(request);
                botaoBonecoPreto.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "PRETO_FOTO.png"));
                botaoBonecoPreto.setBackground(Color.decode("#004000"));
                atualizaBotoes(2);
            }
        });

        botaoBonecoAzul.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Request request = new Request();
                request.setType(Request.REQUEST_TYPE_CREATE_PLAYER);
                request.setParam1(3);
                executeRequest(request);
                botaoBonecoAzul.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "AZUL_FOTO.png"));
                botaoBonecoAzul.setBackground(Color.decode("#004000"));
                atualizaBotoes(3);
            }
        });

        botaoBonecoVermelho.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Request request = new Request();
                request.setType(Request.REQUEST_TYPE_CREATE_PLAYER);
                request.setParam1(4);
                executeRequest(request);
                botaoBonecoVermelho.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "VERMELHO_FOTO.png"));
                botaoBonecoVermelho.setBackground(Color.decode("#004000"));
                atualizaBotoes(4);
            }
        });

        botaoBonecoVerde.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Request request = new Request();
                request.setType(Request.REQUEST_TYPE_CREATE_PLAYER);
                request.setParam1(5);
                executeRequest(request);
                botaoBonecoVerde.setEnabled(false);
                botaoBonecoVerde.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "VERDE_FOTO.png"));
                botaoBonecoVerde.setBackground(Color.decode("#004000"));
                atualizaBotoes(5);
                mainPanel.repaint();
            }
        });

    }

    public static void main(String[] args) {
        Bomber b1 = new Bomber();
        b1.setVisible(true);
        ThreadClient t1 = new ThreadClient(b1, b1.getSocket(), b1.getInputStream(), b1.getOutputStream(), null);
        t1.start();

//        Bomber b2 = new Bomber();
//        b2.setVisible(true);
//        ThreadClient t2 = new ThreadClient(b2, b2.getSocket(), b2.getInputStream(), b2.getOutputStream(), null);
//        t2.start();
//
//        Bomber b3 = new Bomber();
//        b3.setVisible(true);
//        ThreadClient t3 = new ThreadClient(b3, b3.getSocket(), b3.getInputStream(), b3.getOutputStream(), null);
//        t3.start();
//
//        Bomber b4 = new Bomber();
//        b4.setVisible(true);
//        ThreadClient t4 = new ThreadClient(b4, b4.getSocket(), b4.getInputStream(), b4.getOutputStream(), null);
//        t4.start();
//
//        Bomber b5 = new Bomber();
//        b5.setVisible(true);
//        ThreadClient t5 = new ThreadClient(b5, b5.getSocket(), b5.getInputStream(), b5.getOutputStream(), null);
//        t5.start();
    }

    public void iniciarPartida(Bomber b, ThreadClient t, Mapa mapa) {
        b.dispose();
        BomberCloudUI bc = new BomberCloudUI(t.getSocket(), t.getOutputStream(), t.getInputStream(), b.getBoneco(), mapa, usuarioPC, t);
        bc.setVisible(true);
        t.setSocket(bc.getSocket());
        t.setInputStream(bc.getInputStream());
        t.setOutputStream(bc.getOutputStream());
        t.setRefUI(bc);
//        bc.montarTabuleiro();

    }

    //esse método recebe o parametro do indice do boneco que foi clicado, para trocar os botoes dos demais bonecos por
    //imagens nao clicaveis. deixando o usuário escolher apenas o que ele clicou.
    public void atualizaBotoes(int i) {
        switch (i) {
            case 1: {
                botaoBonecoPreto.setEnabled(false);
                botaoBonecoAzul.setEnabled(false);
                botaoBonecoVermelho.setEnabled(false);
                botaoBonecoVerde.setEnabled(false);
            }
            case 2: {
                botaoBonecoBranco.setEnabled(false);
                botaoBonecoAzul.setEnabled(false);
                botaoBonecoVermelho.setEnabled(false);
                botaoBonecoVerde.setEnabled(false);
            }
            case 3: {
                botaoBonecoBranco.setEnabled(false);
                botaoBonecoPreto.setEnabled(false);
                botaoBonecoVermelho.setEnabled(false);
                botaoBonecoVerde.setEnabled(false);
            }
            case 4: {
                botaoBonecoBranco.setEnabled(false);
                botaoBonecoPreto.setEnabled(false);
                botaoBonecoAzul.setEnabled(false);
                botaoBonecoVerde.setEnabled(false);
            }
            case 5: {
                botaoBonecoBranco.setEnabled(false);
                botaoBonecoPreto.setEnabled(false);
                botaoBonecoAzul.setEnabled(false);
                botaoBonecoVermelho.setEnabled(false);
            }
        }
        mainPanel.repaint();
    }

    //muda a imagem do boneco que foi escolhido por outro usuário
    public void atualizaBotoesEscolhido(int i) {
        switch (i) {
            case 1: {
                botaoBonecoBranco.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "brancoEscolhido.png"));
                botaoBonecoBranco.setEnabled(false);
                break;
            }
            case 2: {
                botaoBonecoPreto.setEnabled(false);
                botaoBonecoPreto.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "pretoEscolhido.png"));
                break;
            }
            case 3: {
                botaoBonecoAzul.setEnabled(false);
                botaoBonecoAzul.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "azulEscolhido.png"));
                break;
            }
            case 4: {
                botaoBonecoVermelho.setEnabled(false);
                botaoBonecoVermelho.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "vermelhoEscolhido.png"));
                break;
            }
            case 5: {
                botaoBonecoVerde.setEnabled(false);
                botaoBonecoVerde.setDisabledIcon(new ImageIcon(System.getProperty("user.dir") + System.getProperty("file.separator") + "src" + System.getProperty("file.separator")+ "images"+ System.getProperty("file.separator") + "verdeEscolhido.png"));
                break;
            }
        }
        mainPanel.repaint();
    }

    //método a ser chamado quando um usuário escolher um boneco, ele atualiza na janela o botao, para não ser clicado por 
    //duas pessoas.
    public void atualizaBotaoIniciar() {
        botaoIniciar.setEnabled(true);
    }

    public synchronized Response executeRequest(Request request) {
        Response response = null;
        try {
            outputStream.writeObject(request);
            outputStream.flush();
//            response = (Response) inputStream.readObject();
        } //        catch (ClassNotFoundException ex) {
        //            System.out.println(ex.getMessage());
        //        }
        catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        return response;
    }

    public Boneco getBoneco() {
        return boneco;
    }

    public void setBoneco(Boneco boneco) {
        this.boneco = boneco;
    }

    public ArrayList<Boneco> getListBonecos() {
        return listBonecos;
    }

    public void setListBonecos(ArrayList<Boneco> listBonecos) {
        this.listBonecos = listBonecos;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    public ObjectInputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(ObjectInputStream inputStream) {
        this.inputStream = inputStream;
    }

    public ObjectOutputStream getOutputStream() {
        return outputStream;
    }

    public void setOutputStream(ObjectOutputStream outputStream) {
        this.outputStream = outputStream;
    }
}
